'\" t
.\"     Title: coap_recovery
.\"    Author: [see the "AUTHORS" section]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
.\"      Date: 12/27/2024
.\"    Manual: libcoap Manual
.\"    Source: coap_recovery 4.2.0
.\"  Language: English
.\"
.TH "COAP_RECOVERY" "3" "12/27/2024" "coap_recovery 4\&.2\&.0" "libcoap Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
coap_recovery, coap_session_set_max_retransmit, coap_session_set_ack_timeout, coap_session_set_ack_random_factor, coap_session_get_max_transmit, coap_session_get_ack_timeout, coap_session_get_ack_random_factor, coap_debug_set_packet_loss \- Work with CoAP packet transmissions
.SH "SYNOPSIS"
.sp
\fB#include <coap2/coap\&.h>\fR
.sp
\fBvoid coap_session_set_max_retransmit(coap_session_t *\fR\fB\fIsession\fR\fR\fB, unsigned int \fR\fB\fIvalue\fR\fR\fB)\fR;
.sp
\fBvoid coap_session_set_ack_timeout(coap_session_t *\fR\fB\fIsession\fR\fR\fB, coap_fixed_point_t \fR\fB\fIvalue\fR\fR\fB)\fR;
.sp
\fBvoid coap_session_set_ack_random_factor(coap_session_t *\fR\fB\fIsession\fR\fR\fB, coap_fixed_point_t \fR\fB\fIvalue\fR\fR\fB)\fR;
.sp
\fBunsigned int coap_session_get_max_transmit(coap_session_t *\fR\fB\fIsession\fR\fR\fB)\fR;
.sp
\fBcoap_fixed_point_t coap_session_get_ack_timeout(coap_session_t *\fR\fB\fIsession\fR\fR\fB)\fR;
.sp
\fBcoap_fixed_point_t coap_session_get_ack_random_factor(coap_session_t *\fR\fB\fIsession\fR\fR\fB)\fR;
.sp
\fBint coap_debug_set_packet_loss(const char *\fR\fB\fIloss_level\fR\fR\fB)\fR;
.sp
Link with \fB\-lcoap\-2\fR, \fB\-lcoap\-2\-gnutls\fR, \fB\-lcoap\-2\-openssl\fR or \fB\-lcoap\-2\-tinydtls\fR depending on your (D)TLS library type\&.
.SH "DESCRIPTION"
.sp
For CoAP Confirmable messages, it is possible to define the retry counts, repeat rate etc\&. for error recovery\&. Further information can be found in "RFC7272: 4\&.2\&. Messages Transmitted Reliably"\&.
.sp
It is not recommended that the suggested default setting are changed, but there may be some special requirements that need different values and the consequences of changing these values is fully understood\&.
.sp
Changing the default values for multicast packets is not supported\&.
.sp
Some of the parameters or return values are in fixed point format as defined by the coap_fixed_point_t structure as below
.sp
.if n \{\
.RS 4
.\}
.nf
typedef struct coap_fixed_point_t {
  uint16_t integer_part;    /* Integer part of fixed point variable */
  uint16_t fractional_part; /* Fractional part of fixed point variable
                               1/1000 (3 points) precision */
} coap_fixed_point_t;
.fi
.if n \{\
.RE
.\}
.sp
The CoAP message retry rules are (with the default values to compute the time)
.sp
.if n \{\
.RS 4
.\}
.nf
1st retransmit after 1 * ack_timeout * ack_random factor (3 seconds)
2nd retransmit after 2 * ack_timeout * ack_random factor (6 seconds)
3rd retransmit after 3 * ack_timeout * ack_random factor (12 seconds)
4th retransmit after 4 * ack_timeout * ack_random factor (24 seconds)
5th retransmit after 5 * ack_timeout * ack_random factor (48 seconds)

As max_transmit (by default) is 4, then the 5th retransmit does not get sent,
but at that point COAP_NACK_TOO_MANY_RETRIES gets raised in the nack_handler
(if defined)\&. Note that the sum of the seconds is 93 matching RFC7252\&.
.fi
.if n \{\
.RE
.\}
.sp
It should be noted that these retries are separate from the DTLS or TLS encrypted session setup retry timeouts\&. For DTLS, the initial requesting packet will get sent max_retransmit times before reporting failure\&. For TLS the initial TCP connection will timeout before reporting failure\&.
.sp
It is also possible to set up packet losses, for both confirmable, and non\-confirmable messages\&. This can be used for stress testing packet transmission recovery as well as application handling of lossy networks\&.
.sp
The \fBcoap_session_set_max_retransmit\fR() function updates the \fIsession\fR maximum retransmit count with the new \fIvalue\fR\&. The default value is 4\&.
.sp
The \fBcoap_session_set_ack_timeout\fR() function updates the \fIsession\fR initial ack or response timeout with the new \fIvalue\fR\&. The default value is 2\&.0\&.
.sp
The \fBcoap_session_set_ack_random_factor\fR() function updates the \fIsession\fR ack random wait factor, used to randomize re\-transmissions, with the new \fIvalue\fR\&. The default value is 1\&.5\&.
.sp
The \fBcoap_session_get_max_retransmit\fR() function returns the current \fIsession\fR maximum retransmit count\&.
.sp
The \fBcoap_session_get_ack_timeout\fR() function returns the current \fIsession\fR initial ack or response timeout\&.
.sp
The \fBcoap_session_get_ack_random_factor\fR() function returns the current \fIsession\fR ack random wait factor\&.
.sp
The \fBcoap_debug_set_packet_loss\fR() function is uses to set the packet loss levels as defined in \fIloss_level\fR\&. \fIloss_level\fR can be set as a percentage from "0%" to "100%"\&. Alternatively, it is possible to specify which packets of a packet sequence are dropped\&. A definition of "1,5\-9,11\-20,101" means that packets 1, 5 through 9, 11 through 20 and 101 will get dropped\&. A maximum of 10 different packet sets is supported\&. The packet count is reset to 0 when coap_debug_set_packet_loss() is called\&. To remove any packet losses, set the \fIloss_level\fR to "0%"\&.
.SH "RETURN VALUES"
.sp
\fBcoap_session_get_max_retransmit\fR(), \fBcoap_session_get_ack_timeout\fR() and \fBcoap_session_get_ack_random_factor\fR() return their respective current values\&.
.sp
\fBcoap_debug_set_packet_loss\fR() returns 0 if \fIloss_level\fR does not parse correctly, otherwise 1 if successful\&.
.SH "TESTING"
.sp
The libcoap recovery/re\-transmit logic will only work for confirmable requests\&.
.sp
To see what is happening (other than by sniffing the network traffic), the logging level needs to be set to LOG_DEBUG in the client by using coap_set_log_level(LOG_DEBUG) and coap_dtls_set_log_level(LOG_DEBUG)\&.
.sp
The client needs to be sending confirmable requests during the test\&.
.sp
The server can either be stopped, or if packet loss levels are set to 100% by using coap_debug_set_packet_loss("100%") when receiving the client requests\&.
.sp
\fBNOTE:\fR If the server end of the connection is returning ICMP unreachable packets after being turned off, you will get a debug message of the form "coap_network_read: unreachable", so libcoap will stop doing the retries\&. If this is the case, then you need to make use of (on the server) coap_debug_set_packet_loss("100%") or put in some packet filtering to drop the packets\&.
.sp
The client should then restart transmitting the requests based on the ack_timeout, ack_random_factor and max_retransmit values\&. The client\(cqs nack_handler will get called with COAP_NACK_TOO_MANY_RETRIES when the confirmable request cannot be successfully transmitted\&.
.SH "FURTHER INFORMATION"
.sp
See "RFC7252: The Constrained Application Protocol (CoAP)" for further information\&.
.SH "BUGS"
.sp
Please report bugs on the mailing list for libcoap: libcoap\-developers@lists\&.sourceforge\&.net
.SH "AUTHORS"
.sp
The libcoap project <libcoap\-developers@lists\&.sourceforge\&.net>
